属性和方法

在 Swift 编程中,属性和方法是面向对象编程(OOP)的核心概念。属性用于存储对象的状态,而方法用于定义对象的行为。理解这些概念对于编写结构良好、可维护的代码至关重要。

1. 属性

属性是与类、结构体或枚举关联的值。它们可以分为两种类型:存储属性和计算属性。

1.1 存储属性

存储属性是直接存储在类或结构体中的常量或变量。它们可以是可变的(使用 var 关键字)或不可变的(使用 let 关键字)。

struct Person {
    var name: String
    let age: Int
}

var person = Person(name: "Alice", age: 30)
person.name = "Bob"  // 可以修改,因为 name 是可变的
// person.age = 31  // 错误,因为 age 是不可变的

1.2 计算属性

计算属性不直接存储值,而是提供一个 getter 和一个可选的 setter 来间接获取和设置其他属性的值。

struct Circle {
    var radius: Double
    
    var area: Double {
        get {
            return Double.pi * radius * radius
        }
        set(newArea) {
            radius = sqrt(newArea / Double.pi)
        }
    }
}

var circle = Circle(radius: 5.0)
print(circle.area)  // 输出: 78.53981633974483
circle.area = 100.0
print(circle.radius)  // 输出: 5.641895835477563

1.3 属性观察器

属性观察器用于在属性值发生变化时执行代码。Swift 提供了两种属性观察器:willSet 和 didSet。

class Temperature {
    var celsius: Double = 0.0 {
        willSet {
            print("即将设置新的摄氏温度: \(newValue)")
        }
        didSet {
            print("摄氏温度已设置为: \(celsius)")
        }
    }
}

let temp = Temperature()
temp.celsius = 25.0
// 输出: 即将设置新的摄氏温度: 25.0
// 输出: 摄氏温度已设置为: 25.0

2. 方法

方法是与特定类型(如类、结构体或枚举)关联的函数。它们用于执行与该类型相关的操作。

2.1 实例方法

实例方法是与类的实例关联的方法。它们可以通过实例调用。

class Counter {
    var count = 0
    
    func increment() {
        count += 1
    }
    
    func increment(by amount: Int) {
        count += amount
    }
    
    func reset() {
        count = 0
    }
}

let counter = Counter()
counter.increment()
print(counter.count)  // 输出: 1
counter.increment(by: 5)
print(counter.count)  // 输出: 6
counter.reset()
print(counter.count)  // 输出: 0

2.2 类型方法

类型方法是与类型本身关联的方法,而不是与类型的实例关联。它们使用 static 关键字(在结构体和枚举中)或 class 关键字(在类中)定义。

struct MathUtils {
    static func square(_ number: Int) -> Int {
        return number * number
    }
}

print(MathUtils.square(5))  // 输出: 25

3. 实践练习

练习 1: 计算属性

创建一个 Rectangle 结构体,包含 width 和 height 两个存储属性。添加一个计算属性 area,用于计算矩形的面积。

struct Rectangle {
    var width: Double
    var height: Double
    
    var area: Double {
        return width * height
    }
}

let rect = Rectangle(width: 10.0, height: 5.0)
print(rect.area)  // 输出: 50.0

练习 2: 属性观察器

创建一个 BankAccount 类,包含一个 balance 属性。使用属性观察器在余额发生变化时打印一条消息。

class BankAccount {
    var balance: Double = 0.0 {
        didSet {
            print("账户余额已更新为: \(balance)")
        }
    }
    
    func deposit(amount: Double) {
        balance += amount
    }
    
    func withdraw(amount: Double) {
        balance -= amount
    }
}

let account = BankAccount()
account.deposit(amount: 1000.0)
// 输出: 账户余额已更新为: 1000.0
account.withdraw(amount: 500.0)
// 输出: 账户余额已更新为: 500.0

练习 3: 类型方法

创建一个 StringUtils 结构体,包含一个类型方法 reverse(_ string: String),用于反转字符串。

struct StringUtils {
    static func reverse(_ string: String) -> String {
        return String(string.reversed())
    }
}

print(StringUtils.reverse("Hello"))  // 输出: olleH

4. 总结

属性和方法是 Swift 中面向对象编程的基础。属性用于存储和计算对象的状态,而方法用于定义对象的行为。通过理解和实践这些概念,你可以编写出更加模块化和可维护的代码。

继续学习和实践这些概念,你将能够更好地掌握 Swift 编程,并为更复杂的应用程序打下坚实的基础。